//============================================================================================
/**
 * @file	castle_ui.c
 * @brief	バトルキャッスル インターフェース関連
 * @author	Hiroyuki Nakamura
 * @date	08.11.11
 */
//============================================================================================
#include "common.h"

#include "gflib/touchpanel.h"

#include "castle_sys.h"
#include "castle_ui.h"


//============================================================================================
//	定数定義
//============================================================================================


//============================================================================================
//	プロトタイプ宣言
//============================================================================================
static void DummyCallBack( void * work, int now_pos, int old_pos );

static void PokeSelMineMoveCallBack( void * work, int now_pos, int old_pos );
static void PokeSelMineTouchCallBack( void * work, int now_pos, int old_pos );

static void PokeSelEnemyMoveCallBack( void * work, int now_pos, int old_pos );
static void PokeSelEnemyTouchCallBack( void * work, int now_pos, int old_pos );

static void ItemSelMoveCallBack( void * work, int now_pos, int old_pos );
static void ItemSelTouchCallBack( void * work, int now_pos, int old_pos );


//============================================================================================
//	グローバル変数
//============================================================================================

// タッチ座標テーブル：ポケモン選択（自分・シングル）
static const RECT_HIT_TBL SinglePokeSelMineHitTbl[] =
{
	{ 152, 175, 200, 247 },		// 00: もどる
	{  32,  79,  32,  95 },		// 01: ポケモン１
	{  32,  79,  96, 159 },		// 02: ポケモン２
	{  32,  79, 160, 223 },		// 03: ポケモン３
	{ RECT_HIT_END, 0, 0, 0 }
};
// 移動テーブル：ポケモン選択（自分・シングル）
static const POINTER_WORK SinglePokeSelMineMoveTbl[] =
{
	{ 0, 0, 0, 0,	CURSORMOVE_RETBIT|1, 0, 0, 0 },		// 00: もどる
	{ 0, 0, 0, 0,	1, 0, 3, 2 },		// 01: ポケモン１
	{ 0, 0, 0, 0,	2, 0, 1, 3 },		// 02: ポケモン２
	{ 0, 0, 0, 0,	3, 0, 2, 1 },		// 03: ポケモン３
};
// タッチ座標テーブル：ポケモン選択（自分・マルチ）
static const RECT_HIT_TBL MultiPokeSelMineHitTbl[] =
{
	{ 152, 175, 200, 247 },		// 00: もどる
	{  32,  79,   0,  63 },		// 01: ポケモン１
	{  32,  79,  64, 127 },		// 02: ポケモン２
	{  32,  79, 128, 191 },		// 03: ポケモン３
	{  32,  79, 192, 255 },		// 04: ポケモン４
	{ RECT_HIT_END, 0, 0, 0 }
};
// 移動テーブル：ポケモン選択（自分・マルチ）
static const POINTER_WORK MultiPokeSelMineMoveTbl[] =
{
	{ 0, 0, 0, 0,	CURSORMOVE_RETBIT|1, 0, 0, 0 },		// 00: もどる
	{ 0, 0, 0, 0,	1, 0, 4, 2 },		// 01: ポケモン１
	{ 0, 0, 0, 0,	2, 0, 1, 3 },		// 02: ポケモン２
	{ 0, 0, 0, 0,	3, 0, 2, 4 },		// 03: ポケモン３
	{ 0, 0, 0, 0,	4, 0, 3, 1 },		// 04: ポケモン４
};
// 選択ＩＤ：ポケモン選択（自分）
static const u32 PokeSelMineRetTbl[] = {
	CASTLEUI_ID_POKESEL_END,		// 00: もどる
	CASTLEUI_ID_POKESEL_POKE1,		// 01: ポケモン１
	CASTLEUI_ID_POKESEL_POKE2,		// 02: ポケモン２
	CASTLEUI_ID_POKESEL_POKE3,		// 03: ポケモン３
	CASTLEUI_ID_POKESEL_POKE4,		// 04: ポケモン４
};
// コールバック：ポケモン選択（自分）
static const CURSORMOVE_CALLBACK PokeSelMineCallBack = {
	DummyCallBack,
	DummyCallBack,
	PokeSelMineMoveCallBack,
	PokeSelMineTouchCallBack,
};
// コールバック：ポケモン選択（敵）
static const CURSORMOVE_CALLBACK PokeSelEnemyCallBack = {
	DummyCallBack,
	DummyCallBack,
	PokeSelEnemyMoveCallBack,
	PokeSelEnemyTouchCallBack,
};

// タッチ座標テーブル：アイテム選択
static const RECT_HIT_TBL ItemSelHitTbl[] =
{
	{  32,  71,   0, 127 },			// 00: アイテム１
	{  32,  71, 128, 255 },			// 01: アイテム２
	{  72, 111,   0, 127 },			// 02: アイテム３
	{  72, 111, 128, 255 },			// 03: アイテム４
	{ 112, 151,   0, 127 },			// 04: アイテム５
	{ 112, 151, 128, 255 },			// 05: アイテム６
	{ 160, 191, 200, 255 },			// 06: もどる
	{ RECT_HIT_END, 0, 0, 0 }
};
// 移動テーブル：アイテム選択
static const POINTER_WORK ItemSelMoveTbl[] =
{
	{  64,  52, 0, 0,	0, 2, 0, 1 },		// 00: アイテム１
	{ 192,  52, 0, 0,	1, 3, 0, 1 },		// 01: アイテム２
	{  64,  92, 0, 0,	0, 4, 2, 3 },		// 02: アイテム３
	{ 192,  92, 0, 0,	1, 5, 2, 3 },		// 03: アイテム４
	{  64, 132, 0, 0,	2, 6, 4, 5 },		// 04: アイテム５
	{ 192, 132, 0, 0,	3, 6, 4, 5 },		// 05: アイテム６
	{ 228, 176, 0, 0,	CURSORMOVE_RETBIT|5, 6, 6, 6 },		// 06: もどる
};
// 選択ＩＤ：アイテム選択
static const u32 ItemSelRetTbl[] = {
	CASTLEUI_ID_ITEMSEL_ITEM1,			// 00: アイテム１
	CASTLEUI_ID_ITEMSEL_ITEM2,			// 01: アイテム２
	CASTLEUI_ID_ITEMSEL_ITEM3,			// 02: アイテム３
	CASTLEUI_ID_ITEMSEL_ITEM4,			// 03: アイテム４
	CASTLEUI_ID_ITEMSEL_ITEM5,			// 04: アイテム５
	CASTLEUI_ID_ITEMSEL_ITEM6,			// 05: アイテム６
	CASTLEUI_ID_ITEMSEL_END,			// 06: もどる
};
// コールバック：アイテム選択
static const CURSORMOVE_CALLBACK ItemSelCallBack = {
	DummyCallBack,
	DummyCallBack,
	ItemSelMoveCallBack,
	ItemSelTouchCallBack,
};
// カーソルアニメテーブル：アイテム選択
static const u32 ItemSelCursorAnm[] = {
	CASTLE_ANM_CURSOR_ITEM,
	CASTLE_ANM_CURSOR_ITEM,
	CASTLE_ANM_CURSOR_ITEM,
	CASTLE_ANM_CURSOR_ITEM,
	CASTLE_ANM_CURSOR_ITEM,
	CASTLE_ANM_CURSOR_ITEM,
	CASTLE_ANM_ITEMSEL_RET,
};

// タッチ座標テーブル：アイテム選択
static const RECT_HIT_TBL ItemScrollHitTbl[] =
{
	{ 160, 191,   0,  39 },			// 前へ
	{ 160, 191,  40,  79 },			// 次へ
	{ RECT_HIT_END, 0, 0, 0 }
};


//--------------------------------------------------------------------------------------------
/**
 * @brief	カーソル移動ワーク削除
 *
 * @param	wk		カーソル移動ワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void CASTLEUI_CursorMoveExit( CURSOR_MOVE_WORK * wk )
{
	CURSORMOVE_Exit( wk );
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	カーソル移動ダミーコールバック関数
 *
 * @param	wk			キャッスルワーク ( CASTLE_MINE_WORK or CASTLE_ENEMY_WORK )
 * @param	now_pos		現在の位置
 * @param	old_pos		前回の位置
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void DummyCallBack( void * work, int now_pos, int old_pos )
{
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	カーソル移動ワーク作成（自分側ポケモン選択）
 *
 * @param	wk		キャッスルワーク ( CASTLE_MINE_WORK )
 * @param	pos		カーソル位置
 * @param	max		ポケモン数
 *
 * @return	カーソル移動ワーク
 */
//--------------------------------------------------------------------------------------------
CURSOR_MOVE_WORK * CASTLEUI_CursorMoveInitMine( CASTLE_MINE_WORK * wk, u32 pos, u32 max )
{
	CURSOR_MOVE_WORK * mvwk;

	if( max == 3 ){
		mvwk = CURSORMOVE_Create(
					SinglePokeSelMineHitTbl,
					SinglePokeSelMineMoveTbl,
					&PokeSelMineCallBack,
					wk, TRUE, pos, HEAPID_CASTLE );
	}else{
		mvwk = CURSORMOVE_Create(
					MultiPokeSelMineHitTbl,
					MultiPokeSelMineMoveTbl,
					&PokeSelMineCallBack,
					wk, TRUE, pos, HEAPID_CASTLE );
	}

	return mvwk;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	カーソル移動ワーク作成（敵側ポケモン選択）
 *
 * @param	wk		キャッスルワーク ( CASTLE_ENEMY_WORK )
 * @param	pos		カーソル位置
 * @param	max		ポケモン数
 *
 * @return	カーソル移動ワーク
 */
//--------------------------------------------------------------------------------------------
CURSOR_MOVE_WORK * CASTLEUI_CursorMoveInitEnemy( CASTLE_ENEMY_WORK * wk, u32 pos, u32 max )
{
	CURSOR_MOVE_WORK * mvwk;

	if( max == 3 ){
		mvwk = CURSORMOVE_Create(
					SinglePokeSelMineHitTbl,
					SinglePokeSelMineMoveTbl,
					&PokeSelEnemyCallBack,
					wk, TRUE, pos, HEAPID_CASTLE );
	}else{
		mvwk = CURSORMOVE_Create(
					MultiPokeSelMineHitTbl,
					MultiPokeSelMineMoveTbl,
					&PokeSelEnemyCallBack,
					wk, TRUE, pos, HEAPID_CASTLE );
	}

	return mvwk;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	ポケモン選択メイン
 *
 * @param	wk		カーソル移動ワーク
 *
 * @return	選択状況
 *
 *	敵側も使用してます
 */
//--------------------------------------------------------------------------------------------
u32 CASTLEUI_PokeSelMineCursorMove( CURSOR_MOVE_WORK * wk )
{
	u32	ret = CURSORMOVE_Main( wk );

	switch( ret ){
	case CURSORMOVE_CURSOR_ON:		// カーソル表示
	case CURSORMOVE_CURSOR_MOVE:	// 移動
	case CURSORMOVE_CANCEL:			// キャンセル
	case CURSORMOVE_NONE:			// 動作なし
		return ret;
	}
	return PokeSelMineRetTbl[ret];
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	Ｂボタンキャンセル時のカーソル位置設定
 *
 * @param	wk		カーソル移動ワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void CASTLEUI_PokeSelMineCanselPosSet( CURSOR_MOVE_WORK * wk )
{
	u8	pos = CURSORMOVE_PosGet( wk );

	CURSORMOVE_PosSetEx( wk, 0, pos, pos );
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	カーソル移動コールバック関数：移動（自分側ポケモン選択）
 *
 * @param	wk			キャッスルワーク ( CASTLE_MINE_WORK )
 * @param	now_pos		現在の位置
 * @param	old_pos		前回の位置
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void PokeSelMineMoveCallBack( void * work, int now_pos, int old_pos )
{
	CASTLEMINE_CursorPosSet( work, PokeSelMineRetTbl[now_pos], PokeSelMineRetTbl[old_pos] );
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	カーソル移動コールバック関数：タッチ（自分側ポケモン選択）
 *
 * @param	wk			キャッスルワーク ( CASTLE_MINE_WORK )
 * @param	now_pos		現在の位置
 * @param	old_pos		前回の位置
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void PokeSelMineTouchCallBack( void * work, int now_pos, int old_pos )
{
	CASTLEMINE_CursorPosSet( work, PokeSelMineRetTbl[now_pos], PokeSelMineRetTbl[old_pos] );
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	カーソル移動コールバック関数：移動（敵側ポケモン選択）
 *
 * @param	wk			キャッスルワーク ( CASTLE_ENEMY_WORK )
 * @param	now_pos		現在の位置
 * @param	old_pos		前回の位置
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void PokeSelEnemyMoveCallBack( void * work, int now_pos, int old_pos )
{
	CASTLEENEMY_CursorPosSet( work, PokeSelMineRetTbl[now_pos], PokeSelMineRetTbl[old_pos] );
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	カーソル移動コールバック関数：タッチ（敵側ポケモン選択）
 *
 * @param	wk			キャッスルワーク ( CASTLE_ENEMY_WORK )
 * @param	now_pos		現在の位置
 * @param	old_pos		前回の位置
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void PokeSelEnemyTouchCallBack( void * work, int now_pos, int old_pos )
{
	CASTLEENEMY_CursorPosSet( work, PokeSelMineRetTbl[now_pos], PokeSelMineRetTbl[old_pos] );
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	カーソル移動ワーク作成（アイテム選択）
 *
 * @param	wk		キャッスルワーク ( CASTLE_MINE_WORK )
 *
 * @return	カーソル移動ワーク
 */
//--------------------------------------------------------------------------------------------
CURSOR_MOVE_WORK * CASTLEUI_CursorMoveInitItem( CASTLE_MINE_WORK * wk )
{
	CURSOR_MOVE_WORK * mvwk;

	mvwk = CURSORMOVE_Create(
			ItemSelHitTbl,
			ItemSelMoveTbl,
			&ItemSelCallBack,
			wk, TRUE, 0, HEAPID_CASTLE );

	CASTLEMINE_ItemSelCursorPut(
		wk,
		ItemSelMoveTbl[0].px,
		ItemSelMoveTbl[0].py,
		ItemSelCursorAnm[0] );

	CASTLEMINE_ItemSelInfoPut( wk, 0 );

	return mvwk;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	アイテム選択メイン
 *
 * @param	wk		カーソル移動ワーク
 *
 * @return	選択状況
 */
//--------------------------------------------------------------------------------------------
u32 CASTLEUI_ItemSelCursorMove( CURSOR_MOVE_WORK * wk )
{
	u32	ret = CURSORMOVE_Main( wk );

	switch( ret ){
	case CURSORMOVE_CURSOR_ON:		// カーソル表示
	case CURSORMOVE_CURSOR_MOVE:	// 移動
	case CURSORMOVE_CANCEL:			// キャンセル
		return ret;

	case CURSORMOVE_NONE:			// 動作なし
		if( sys.trg & PAD_KEY_LEFT ){
			u8	pos = CURSORMOVE_PosGet( wk );
			if( pos == 0 || pos == 2 || pos == 4 ){
				return CASTLEUI_ID_ITEMSEL_LEFT;
			}
		}
		if( sys.trg & PAD_KEY_RIGHT ){
			u8	pos = CURSORMOVE_PosGet( wk );
			if( pos == 1 || pos == 3 || pos == 5 ){
				return CASTLEUI_ID_ITEMSEL_RIGHT;
			}
		}
//		return CURSORMOVE_NONE;
		break;

	default:
		return ItemSelRetTbl[ret];
	}

	// スクロール
	ret = GF_TP_RectHitTrg( ItemScrollHitTbl );
	if( ret == 0 ){
		return CASTLEUI_ID_ITEMSEL_LEFT;
	}else if( ret == 1 ){
		return CASTLEUI_ID_ITEMSEL_RIGHT;
	}

//	return ItemSelRetTbl[ret];
	return CURSORMOVE_NONE;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	カーソル移動コールバック関数：移動（アイテム選択）
 *
 * @param	wk			キャッスルワーク ( CASTLE_MINE_WORK )
 * @param	now_pos		現在の位置
 * @param	old_pos		前回の位置
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void ItemSelMoveCallBack( void * work, int now_pos, int old_pos )
{
	CASTLEMINE_ItemSelCursorPut(
		work,
		ItemSelMoveTbl[now_pos].px,
		ItemSelMoveTbl[now_pos].py,
		ItemSelCursorAnm[now_pos] );

	CASTLEMINE_ItemSelInfoPut( work, now_pos );
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	カーソル移動コールバック関数：タッチ（アイテム選択）
 *
 * @param	wk			キャッスルワーク ( CASTLE_MINE_WORK )
 * @param	now_pos		現在の位置
 * @param	old_pos		前回の位置
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void ItemSelTouchCallBack( void * work, int now_pos, int old_pos )
{
	CASTLEMINE_ItemSelCursorPut(
		work,
		ItemSelMoveTbl[now_pos].px,
		ItemSelMoveTbl[now_pos].py,
		ItemSelCursorAnm[now_pos] );

	CASTLEMINE_ItemSelInfoPut( work, now_pos );
}



//============================================================================================
//	selbox
//============================================================================================

//--------------------------------------------------------------------------------------------
/**
 * @brief	選択メニューボックスシステム初期化
 *
 * @param	csp		※未使用
 * @param	pfd		パレットフェードワーク
 *
 * @return	選択メニューボックスシステム
 */
//--------------------------------------------------------------------------------------------
SELBOX_SYS * CASTLEUI_SelBoxCreate( CLACT_SET_PTR csp, PALETTE_FADE_PTR pfd )
{
	return SelectBoxSys_AllocWork( HEAPID_CASTLE, pfd );
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	選択メニューボックスシステム削除
 *
 * @param	selbox	選択メニューボックスシステム
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void CASTLEUI_SelBoxFree( SELBOX_SYS * selbox )
{
	SelectBoxSys_Free( selbox );
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	選択メニューボックス開始
 *
 * @param	selbox	選択メニューボックスシステム
 * @param	hd		選択メニューボックスヘッダーデータ
 * @param	x		Ｘ座標
 * @param	y		Ｙ座標
 * @param	sx		Ｘサイズ
 *
 * @return	選択メニューボックスワーク
 */
//--------------------------------------------------------------------------------------------
SELBOX_WORK * CASTLEUI_SelBoxSet( SELBOX_SYS * selbox, SELBOX_HEADER * hd, u8 x, u8 y, u8 sx )
{
	SELBOX_WORK * sbwk;

	sbwk = SelectBoxSet(
				selbox,
				hd,
				APP_END_KEY,
				x, y, sx, 0 );

	return sbwk;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	選択メニューボックス終了
 *
 * @param	wk		選択メニューボックスワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void CASTLEUI_SelBoxExit( SELBOX_WORK * wk )
{
	SelectBoxExit( wk );
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	決定チェック
 *
 * @param	none
 *
 * @retval	"TRUE = 決定"
 * @retval	"FALSE = それ以外"
 */
//--------------------------------------------------------------------------------------------
BOOL CASTLEUI_SkipCheck(void)
{
	if( sys.trg & (PAD_BUTTON_DECIDE | PAD_BUTTON_CANCEL) ){
		return TRUE;
	}
	return GF_TP_GetTrg();
}